#include "../include/Link_List.h"

// 初始化链表
Head_Node *Init_Link_List()
{
    Head_Node *Head = NULL;

    // 创建动态空间
    Head = (Head_Node *)malloc(sizeof(Head_Node));

    // 安全判断
    if (Head == NULL)
    {
        printf("链表创建失败!\n");
        return NULL;
    }

    Head->next = NULL;

    return Head;
}

// 销毁链表
void Free_Link_List(Head_Node **Head)
{
    // 安全判断
    if (*Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if ((*Head)->next == NULL)
    {
        printf("链表为空\n");
    }

    Node *ptr_1 = (*Head)->next;
    Node *ptr_2 = ptr_1->next;

    // 销毁节点
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if (ptr_2 != NULL) // 当ptr_2为 NULL 时 ptr_2不往下跳了 在跳会越界
        {
            ptr_2 = ptr_2->next;
        }
    }

    // 销毁头节点
    (*Head)->next = NULL;
    free(*Head);
}

// 插入
void Insert_Link_List(Head_Node *Head, Element_data data, int pos)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }

    // 创建动态内存
    Node *New_Nod = (Node *)malloc(sizeof(Node));

    // 分配数据
    New_Nod->next = NULL;
    New_Nod->data = data;

    // 头插
    if (pos == 1)
    {
        New_Nod->next = Head->next;
        Head->next = New_Nod;
        return;
    }

    // 中间插 / 尾插
    {
        Node *ptr = Head->next;
        for (size_t i = 1; i < pos - 1 && ptr != NULL; i++) // ptr指向第pos的前一个节点
        {
            ptr = ptr->next;
        }

        New_Nod->next = ptr->next;
        ptr->next = New_Nod;
    }
}

// 删除
void Del_Link_List(Head_Node *Head, int pos)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (Head->next == NULL)
    {
        printf("链表为空\n");
        return;
    }
    Node *ptr_1 = Head->next;
    Node *ptr_2 = NULL; // 储存要删节点的地址
    // 删头
    if (pos == 1)
    {
        Head->next = ptr_1->next;
        free(ptr_1); // 存放第一个节点的地址 方便销毁
        return;
    }

    // 删除 中间 / 尾 节点
    for (size_t i = 1; i < pos - 1 && ptr_1 != NULL; i++) // ptr_1指向要删除节点的前一个节点
    {
        ptr_1 = ptr_1->next;
    }

    ptr_2 = ptr_1->next;
    ptr_1->next = ptr_2->next;
    free(ptr_2);
}

// 遍历
void Printf_Link_List(Head_Node *Head)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (Head->next == NULL)
    {
        printf("啥也没有,遍历个集贸\n");
        return;
    }

    Node *ptr = Head->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        printf("账户:%s 性别:%s 年龄:%d 工号:%d 密码:%s 账号权限%d:\n", ptr->data.user,
               ptr->data.sex, ptr->data.age, ptr->data.id, ptr->data.pas, ptr->data.id_rank);
        ptr = ptr->next;
    }
}

// 名字查找
int Find_By_Name(Head_Node *Head, char *name)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return EOF;
    }
    if (Head->next == NULL)
    {
        printf("啥也没有,找个集贸\n");
        return EOF;
    }

    Node *ptr = Head->next;
    for (size_t i = 0; ptr != NULL; i++)
    {
        if (!strcmp(ptr->data.user, name))
        {
            return ptr->data.id;
        }
        ptr = ptr->next;
    }
    printf("该账号信息不存在\n");
}

// 清空
void Empty_Link_List(Head_Node *Head)
{
    // 安全判断
    if (Head == NULL)
    {
        printf("链表为NULL\n");
        return;
    }
    if (Head->next == NULL)
    {
        printf("链表为空\n");
        return;
    }

    Node *ptr_1 = Head->next;
    Node *ptr_2 = ptr_1->next;

    // 销毁节点
    for (size_t i = 0; ptr_1 != NULL; i++)
    {
        free(ptr_1);
        ptr_1 = ptr_2;
        if (ptr_2 != NULL) // 当ptr_2为 NULL 时 ptr_2不往下跳了 在跳会越界
        {
            ptr_2 = ptr_2->next;
        }
    }
    Head->next = NULL;
}